﻿using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace ProjetoFinal
{
    // Melhorar a animação do macaco. (deixá-la mais rápida)
    // Fazer sumir e resorteando tudo. (tentar colocar mais frutas na tela)
    // Implementar as fases após todos os problemas acima serem selecionados.


    //  ANIMAÇÃO DO MACACO TA ERRADA (DEPOIS QUE EU MUDEI O TAMANHO DELE )

    // Mostrar a pontuação ao termino do jogo
    // ao mudar de fase, diminuir os retangulos, aumentar a velocidade do macaco, e a pontuação mínima
    // se as frutas colidirem, desenha em outro local

    // se o tempo acabou, aparece a imagem de vc perdeu com os lenhadores
    // se as vidas acabaram, aparece a imagem vc perdeu

    public class MyGame
    {
        Texture2D scene; // fundo da tela 
        Texture2D preto; // textura para o retangulo, não está sendo usada
        Leaf leaf;
        Monkey monkey;
        CollisionManager collisionManager;
        Song forestSong;
        public int life; // vidas do jogo
        bool lostLife = false;
        List<Texture2D> listofLives = new List<Texture2D>(); // lista de vidas (3)
        Texture2D gameslife; // textura para poder desenhar as carinhas de vida 
        Random rnd = new Random(); // random para várias coisas (retangulo, case de fruta,)
        
        int drawnFruit; // fruta sorteada
        int drawnRectI; // linha retangulo sorteado
        int drawnRectJ; // coluna retangulo sorteado
        int finalPositionX; // posicao x da fruta no retangulo
        int finalPositionY; // posicao y da fruta no retangulo
        public static bool won; // usada para o draw na classe gameover
        Vector2[,] listPosition;
        bool[,] listEmpty; // lista que auxilia na utilização da lista de retangulos (espaços para a fruta aparecer)
       
        public static int score;// pontos do jogo
        SpriteFont font; // sprite fonte do jogo
        Fruit[] fruits; // array de frutas

        public void Initialize()
        {
            leaf = new Leaf(5, new Rectangle(400, 730, 100, 61), new Rectangle(400, 700, 204, 61));
            monkey = new Monkey(new Rectangle(0, 0, 192, 196), new Rectangle(430, 577, 108, 98), new Vector2(5, 5), 5, 250);
            collisionManager = new CollisionManager();
            life = 3;
            won = false; 
            listPosition = new Vector2[4, 5]; // LISTA DE RETANGULO 2 linhas 4 colunas
            listEmpty = new bool[4, 5];
            Sort();
            fruits = new Fruit[20];

            // instancia os retângulos vazios
            for (int i = 0; i < 4; i++)
                for (int j = 0; j < 5; j++)
                    listEmpty[i, j] = true;

            CreateRect(); // cria os retangulos (espaços) na arvore para as frutas aparecerem dentro deles -- TAVA NO UPDATE!!!!

        } 

        public void LoadContent(ContentManager content)
        {
            leaf.LoadContent(content);
            monkey.LoadContent(content);
            gameslife = content.Load<Texture2D>("monckeybutton");
            scene = content.Load<Texture2D>("scene");
            preto = content.Load<Texture2D>("preto");
            forestSong = content.Load<Song>("ForestSound");
            font = content.Load<SpriteFont>("font");

            // LISTA DE VIDAS DO JOGO (macaco)
            for (int i = 0; i <= 3; i++)
                listofLives.Add(gameslife);

            Fruit.c = content;// content para carregar as frutas
        }

        public void Sort()
        {
            drawnFruit = rnd.Next(1, 6); // sorteia a fruta
            drawnRectI = rnd.Next(0, 4); // sorteia a linha entre os  retangulos que a fruta vai aparecer
            drawnRectJ = rnd.Next(0, 5); // sprteia a coluna entre as colunas dos retangulos em que a fruta vai aparecer
            finalPositionX = rnd.Next(0, 200); // sorteia a posição X dentro do retangulo em que a fruta vai aparecer
            finalPositionY = rnd.Next(0, 70); // sorteia a posicao Y dentro do retangulo em que a fruta vai aparecer
        }


        public void Update(KeyboardState nowKeybord, KeyboardState oldKeyboard, GameOver gameOver)
        {
            if (nowKeybord.IsKeyDown(Keys.Escape))
                Manager.nowState = Manager.GameState.Quit;

            if (life > 0) // se o jogo ainda nao acabou
            {
                if (monkey.backtoposition == true)// se tem que voltar pra posição
                {
                    // para trocar as frutas
                    for (int i = 0; i < fruits.Length; i++)
                        fruits[i] = null;
                    //para modificar os retangulos
                    for (int i = 0; i < 4; i++)
                        for (int j = 0; j < 5; j++)
                            listEmpty[i, j] = true;

                    monkey.backtoposition = false;
                    monkey.BackToPosition(ref life, ref lostLife);
                    leaf.BackToPosition(ref lostLife);
                    Console.WriteLine("back to position NO MYGAME: " + monkey.backtoposition);

                    
                }
            }
            

            if (life == 0)
            {
                won = false;
                MediaPlayer.Pause();
                gameOver.Restart();
                Manager.nowState = Manager.GameState.GameOver;
            }

            Sort(); // função de sorteio
            monkey.Move();
            leaf.Move(nowKeybord, oldKeyboard);
            collisionManager.Collision(leaf, monkey);

            switch (drawnFruit) // fruta sorteada
            {
                case 1:
                    if (listEmpty[drawnRectI, drawnRectJ]) // se o retangulo ta vazioo
                    {
                        // Percorre a lista de frutas
                        for (int i = 0; i < fruits.Length; i++)
                        {
                            if (fruits[i] == null)// se a posicao na lista de frutas esta vazia - desenha
                            {
                                if ((!(finalPositionX + listPosition[drawnRectI, drawnRectJ].X > 1024)) || !((finalPositionY + listPosition[drawnRectI, drawnRectJ].Y) > 768))// se a posiçao x e y da fruta não passar da tela 
                                {
                                            fruits[i] = new Fruit(new Vector2(finalPositionX + listPosition[drawnRectI, drawnRectJ].X, finalPositionY + listPosition[drawnRectI, drawnRectJ].Y), Fruit.type.banana);

                                }

                                if (((finalPositionX + listPosition[drawnRectI, drawnRectJ].X > 1024)) || ((finalPositionY + listPosition[drawnRectI, drawnRectJ].Y) > 768))  // se passar
                                {
                                        fruits[i] = new Fruit(new Vector2(finalPositionX - listPosition[drawnRectI, drawnRectJ].X, finalPositionY - listPosition[drawnRectI, drawnRectJ].Y), Fruit.type.banana);
                                }

                                i = fruits.Length + 1;
                            } 

                        }

                        listEmpty[drawnRectI, drawnRectJ] = false; // posicao na lista de retangulos  preenchida com fruta
                    }



                    break;



                case 2:

                    if (listEmpty[drawnRectI, drawnRectJ]) // se o retangulo ta vazioo
                    {
                        // Percorre a lista de frutas
                        for (int i = 0; i < fruits.Length; i++)
                        {
                            if (fruits[i] == null)// se a posicao na lista de frutas esta vazia - desenha
                            {
                                if ((!(finalPositionX + listPosition[drawnRectI, drawnRectJ].X > 1024)) || !((finalPositionY + listPosition[drawnRectI, drawnRectJ].Y) > 768))// se a posiçao x e y da fruta não passar da tela 
                                {
                                    fruits[i] = new Fruit(new Vector2(finalPositionX + listPosition[drawnRectI, drawnRectJ].X, finalPositionY + listPosition[drawnRectI, drawnRectJ].Y), Fruit.type.acai);

                                }
                                if (((finalPositionX + listPosition[drawnRectI, drawnRectJ].X > 1024)) || ((finalPositionY + listPosition[drawnRectI, drawnRectJ].Y) > 768))  // se passar
                                {
                                    fruits[i] = new Fruit(new Vector2(finalPositionX - listPosition[drawnRectI, drawnRectJ].X, finalPositionY - listPosition[drawnRectI, drawnRectJ].Y), Fruit.type.acai);
                                }

                                i = fruits.Length + 1; 

                            }

                        }

                        listEmpty[drawnRectI, drawnRectJ] = false; // posicao na lista de retangulos  preenchida com fruta
                    }


                    break;




                case 3:

                    if (listEmpty[drawnRectI, drawnRectJ]) // se o retangulo ta vazioo
                    {
                        // Percorre a lista de frutas
                        for (int i = 0; i < fruits.Length; i++)
                        {
                            if (fruits[i] == null)// se a posicao na lista de frutas esta vazia - desenha
                            {
                                if ((!(finalPositionX + listPosition[drawnRectI, drawnRectJ].X > 1024)) || !((finalPositionY + listPosition[drawnRectI, drawnRectJ].Y) > 768))// se a posiçao x e y da fruta não passar da tela 
                                {
                                    fruits[i] = new Fruit(new Vector2(finalPositionX + listPosition[drawnRectI, drawnRectJ].X, finalPositionY + listPosition[drawnRectI, drawnRectJ].Y), Fruit.type.graviola);

                                }
                                if (((finalPositionX + listPosition[drawnRectI, drawnRectJ].X > 1024)) || ((finalPositionY + listPosition[drawnRectI, drawnRectJ].Y) > 768))  // se passar
                                {
                                    fruits[i] = new Fruit(new Vector2(finalPositionX - listPosition[drawnRectI, drawnRectJ].X, finalPositionY - listPosition[drawnRectI, drawnRectJ].Y), Fruit.type.graviola);
                                }

                                i = fruits.Length + 1;
                            }
                        }

                        listEmpty[drawnRectI, drawnRectJ] = false; // posicao na lista de retangulos  preenchida com fruta
                    }


                    break;



                case 4:


                    if (listEmpty[drawnRectI, drawnRectJ]) // se o retangulo ta vazioo
                    {
                        // Percorre a lista de frutas
                        for (int i = 0; i < fruits.Length; i++)
                        {
                            if (fruits[i] == null)// se a posicao na lista de frutas esta vazia - desenha
                            {
                                if ((!(finalPositionX + listPosition[drawnRectI, drawnRectJ].X > 1024)) || !((finalPositionY + listPosition[drawnRectI, drawnRectJ].Y) > 768))// se a posiçao x e y da fruta não passar da tela 
                                {
                                    fruits[i] = new Fruit(new Vector2(finalPositionX + listPosition[drawnRectI, drawnRectJ].X, finalPositionY + listPosition[drawnRectI, drawnRectJ].Y), Fruit.type.mango);

                                }
                                if (((finalPositionX + listPosition[drawnRectI, drawnRectJ].X > 1024)) || ((finalPositionY + listPosition[drawnRectI, drawnRectJ].Y) > 768)) // se passar
                                {
                                    fruits[i] = new Fruit(new Vector2(finalPositionX - listPosition[drawnRectI, drawnRectJ].X, finalPositionY - listPosition[drawnRectI, drawnRectJ].Y), Fruit.type.mango);
                                }

                                i = fruits.Length + 1;
                            }

                        }

                        listEmpty[drawnRectI, drawnRectJ] = false; // posicao na lista de retangulos  preenchida com fruta
                    }


                    break;



                case 5:

                    if (listEmpty[drawnRectI, drawnRectJ]) // se o retangulo ta vazioo
                    {
                        // Percorre a lista de frutas
                        for (int i = 0; i < fruits.Length; i++)
                        {
                            if (fruits[i] == null)// se a posicao na lista de frutas esta vazia - desenha
                            {
                                if ((!(finalPositionX + listPosition[drawnRectI, drawnRectJ].X > 1024)) || !((finalPositionY + listPosition[drawnRectI, drawnRectJ].Y) > 768))// se a posiçao x e y da fruta não passar da tela 
                                {
                                    fruits[i] = new Fruit(new Vector2(finalPositionX + listPosition[drawnRectI, drawnRectJ].X, finalPositionY + listPosition[drawnRectI, drawnRectJ].Y), Fruit.type.jackfruit);

                                }
                                if (((finalPositionX + listPosition[drawnRectI, drawnRectJ].X > 1024)) || ((finalPositionY + listPosition[drawnRectI, drawnRectJ].Y) > 768))// se passar
                                {
                                    fruits[i] = new Fruit(new Vector2(finalPositionX - listPosition[drawnRectI, drawnRectJ].X, finalPositionY - listPosition[drawnRectI, drawnRectJ].Y), Fruit.type.jackfruit);
                                }

                                i = fruits.Length + 1;

                            }
                        }

                        listEmpty[drawnRectI, drawnRectJ] = false; // posicao na lista de retangulos  preenchida com fruta
                    }
                    break;
            }

            #region Colisao do macaco com as frutas
            // percorre a lista de frutas
            for (int i = 0; i < 20; i++)
            {
                if (fruits[i] != null) // se a posicao nao esta vazia
                {
                    if (monkey.rectDestination.Intersects(fruits[i].rectCollision)) // se a fruta e o macaco se tocaram
                    {
                        Console.WriteLine("hehe: " + fruits[i].FruitType.ToString());
                        score += fruits[i].FruitType.GetHashCode(); // soma o ponto da fruta nos pontos do jogo
                        fruits[i] = null;// REMOVER A FRUTA DA POSIÇÃO DA LISTA QUE FOI DESTRUÍDA.

                        // TEM QUE COLOCAR O RETANGULO EM QUE A FRUTA ESTAVA VAZIO TB!!!!
                        listEmpty[(int)(i / 8), (int)(i % 5)] = true; // listEMpty[indice da fruta / 4 (numero de linhas),indice da fruta % 4 (numero de colunas)] - encontra o retangulo que estava com a fruta e o avisa que ele está vazio para receber uma nova fruta
                    }
                }

            }
#endregion
        }
            


        public void CreateRect() // Cria os retangulos na arvore
        {
            for (int i = 0; i < 4; i++)
                for (int j = 0; j < 5; j++)
                    listPosition[i, j] = new Vector2(j * 200 + j, i * 70 + i);


        }
       
        public void Draw(SpriteBatch spriteBatch)
        {
            spriteBatch.Begin();
            spriteBatch.Draw(scene, new Vector2(0, 0), Color.White);
            leaf.Draw(spriteBatch);
            monkey.Draw(spriteBatch);
            spriteBatch.DrawString(font, "Pontos: " + (int)score, new Vector2(0, 120), Color.White);

            // desenhando os retangulos pretos
            //for (int i = 0; i < 4; i++)
            //    for (int j = 0; j < 5; j++)
            //    {
            //        spriteBatch.Draw(preto, listPosition[i, j] = new Vector2(j * 200 + j, i * 70 + i), Color.White);
            //    }
            
            // desenhando as frutas
            for (int i = 0; i < fruits.Length; i++)
            {
                    if (fruits[i] != null)
                    fruits[i].Draw(spriteBatch);
                
            }
            // desenhando a vida
            if (life > 0)
            {
                for (int i = 0; i < life; i++)
                {
                    spriteBatch.Draw(gameslife, new Vector2(980 - (50 * i), 10), Color.White);
                }
            }
            
            spriteBatch.End();
        }

        public void Restart()
        {
            life = 3;
            won = false;
            MediaPlayer.Play(forestSong);
            CreateRect(); // cria os retangulos (espaços) na arvore para as frutas aparecerem dentro deles -- TAVA NO UPDATE!
            Sort();

            //para modificar as posições e as frutas 
            for (int i = 0; i < fruits.Length; i++)
                fruits[i] = null;

            //para modificar os retangulos
            for (int i = 0; i < 4; i++)
                for (int j = 0; j < 5; j++)
                    listEmpty[i, j] = true;
           
        }

    }
}
